/*
 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

#ifndef _APPLE80211_VAR_H_
#define _APPLE80211_VAR_H_

#include <sys/types.h>
#include <net/ethernet.h>
#include <sys/param.h>

// Sizes and limits
#define APPLE80211_ADDR_LEN			6
#define APPLE80211_MAX_RATES		15
#define APPLE80211_MAX_SSID_LEN		32
#define APPLE80211_MAX_ANTENNAE		4
#define APPLE80211_MAX_RADIO		4
#define APPLE80211_MAX_CHANNELS		64
#define APPLE80211_MAX_STATIONS		128
#define APPLE80211_MAX_VERSION_LEN	256
#define APPLE80211_MAX_ROM_SIZE		32768	// 32 KB
#define APPLE80211_MAX_RSN_IE_LEN	257		// 255 + type and length bytes
#define APPLE80211_MAX_CC_LEN		3
#define APPLE80211_MAX_MCS_INDEX	76
#define APPLE80211_MAX_MPDU_FACTOR	3
#define APPLE80211_MAX_MPDU_DENSITY	7
#define APPLE80211_MAX_WOW_PAT_LEN	1500	// Max wake on wireless pattern length
#define APPLE80211_MAX_WOW_PATTERNS	12		// Arbitrary..this can change

#define APPLE80211_MAP_SIZE( _bits ) (roundup( _bits, NBBY )/NBBY)

enum apple80211_phymode {
	APPLE80211_MODE_UNKNOWN			= 0,
	APPLE80211_MODE_AUTO			= 0x1,		// autoselect
	APPLE80211_MODE_11A				= 0x2,		// 5GHz, OFDM
	APPLE80211_MODE_11B				= 0x4,		// 2GHz, CCK
	APPLE80211_MODE_11G				= 0x8,		// 2GHz, OFDM
	APPLE80211_MODE_11N				= 0x10,		// 2GHz/5GHz, OFDM
	APPLE80211_MODE_TURBO_A			= 0x20,		// 5GHz, OFDM, 2x clock
	APPLE80211_MODE_TURBO_G			= 0x40,		// 2GHz, OFDM, 2x clock
};

enum apple80211_physubmode {
	APPLE80211_SUBMODE_UNKNOWN			= 0x0,
	APPLE80211_SUBMODE_11N_AUTO			= 0x1,	// 11n mode determined by AP capabilities
	APPLE80211_SUBMODE_11N_LEGACY		= 0x2,	// legacy
	APPLE80211_SUBMODE_11N_LEGACY_DUP	= 0x4,	// legacy duplicate
	APPLE80211_SUBMODE_11N_HT			= 0x8,	// high throughput
	APPLE80211_SUBMODE_11N_HT_DUP		= 0x10,	// high throughput duplicate
	APPLE80211_SUBMODE_11N_GF			= 0x20,	// green field
};

// flags
enum apple80211_opmode {
	APPLE80211_M_NONE		= 0x0,
	APPLE80211_M_STA		= 0x1,		// infrastructure station
	APPLE80211_M_IBSS		= 0x2,		// IBSS (adhoc) station
	APPLE80211_M_AHDEMO		= 0x4,		// Old lucent compatible adhoc demo
	APPLE80211_M_HOSTAP		= 0x8,		// Software Access Point
	APPLE80211_M_MONITOR	= 0x10		// Monitor mode
};

enum apple80211_apmode	{
	APPLE80211_AP_MODE_UNKNOWN = 0,	
	APPLE80211_AP_MODE_IBSS	   = 1,		// IBSS (adhoc) station
	APPLE80211_AP_MODE_INFRA   = 2,		// Access Point
	APPLE80211_AP_MODE_ANY	   = 3,		// Any supported mode
};

enum apple80211_state {
	APPLE80211_S_INIT	= 0,			// default state
	APPLE80211_S_SCAN	= 1,			// scanning
	APPLE80211_S_AUTH	= 2,			// try to authenticate
	APPLE80211_S_ASSOC	= 3,			// try to assoc
	APPLE80211_S_RUN	= 4,			// associated
};

enum apple80211_protmode {
	APPLE80211_PROTMODE_OFF			= 0,	// no protection
	APPLE80211_PROTMODE_AUTO		= 1,	// auto
	APPLE80211_PROTMODE_CTS			= 2,	// CTS to self
	APPLE80211_PROTMODE_RTSCTS		= 3,	// RTS-CTS
	APPLE80211_PROTMODE_DUAL_CTS	= 4,	// dual CTS
};

enum apple80211_cipher_type {  
	APPLE80211_CIPHER_NONE	  = 0,		// open network
	APPLE80211_CIPHER_WEP_40  = 1,		// 40 bit WEP
	APPLE80211_CIPHER_WEP_104 = 2,		// 104 bit WEP
	APPLE80211_CIPHER_TKIP	  = 3,		// TKIP (WPA)
	APPLE80211_CIPHER_AES_OCB = 4,		// AES (OCB)
	APPLE80211_CIPHER_AES_CCM = 5,		// AES (CCM)
	APPLE80211_CIPHER_PMK	  = 6,		// PMK
	APPLE80211_CIPHER_PMKSA	  = 7,		// PMK obtained from pre-authentication
};

enum apple80211_cipher_key_type
{
	APPLE80211_CIPHER_KEY_TYPE_UNICAST	 = 0,	// unicast cipher key
	APPLE80211_CIPHER_KEY_TYPE_MULTICAST = 1	// multicast cipher key
};

// Low level 802.11 authentication types

enum apple80211_authtype_lower
{
	APPLE80211_AUTHTYPE_OPEN		= 1,	// open
	APPLE80211_AUTHTYPE_SHARED		= 2,	// shared key
	APPLE80211_AUTHTYPE_CISCO		= 3,	// cisco net eap
};

// Higher level authentication used after 802.11 association complete

enum apple80211_authtype_upper
{
	APPLE80211_AUTHTYPE_NONE		= 0,	//	No upper auth
	APPLE80211_AUTHTYPE_WPA			= 1,	//	WPA
	APPLE80211_AUTHTYPE_WPA_PSK		= 2,	//	WPA PSK
	APPLE80211_AUTHTYPE_WPA2		= 3,	//	WPA2
	APPLE80211_AUTHTYPE_WPA2_PSK	= 4,	//	WPA2 PSK
	APPLE80211_AUTHTYPE_LEAP		= 5,	//	LEAP
	APPLE80211_AUTHTYPE_8021X		= 6,	//	802.1x
	APPLE80211_AUTHTYPE_WPS			= 7,	//	WiFi Protected Setup
};

// Unify association status code and deauth reason codes into a single enum describing
// common error conditions
enum apple80211_associate_result
{
	APPLE80211_RESULT_UNAVAILABLE				= 0,  // No association/authentication result ready
	APPLE80211_RESULT_SUCCESS					= 1,  // APPLE80211_STATUS_SUCCESS and no deauth
	APPLE80211_RESULT_UNSPECIFIED_FAILURE		= 2,  // APPLE80211_STATUS_UNSPECIFIED_FAILURE
	APPLE80211_RESULT_UNSUPPORTED_CAPAPBILITIES = 3,  // APPLE80211_STATUS_UNSUPPORTED_CAPABILITIES
	APPLE80211_RESULT_REASSOCIATION_DENIED		= 4,  // APPLE80211_STATUS_REASSOCIATION_DENIED
	APPLE80211_RESULT_ASSOCIATION_DENIED		= 5,  // APPLE80211_STATUS_ASSOCIATION_DENIED
	APPLE80211_RESULT_AUTH_ALG_UNSUPPORTED		= 6,  // APPLE80211_STATUS_AUTH_ALG_UNSUPPORTED
	APPLE80211_RESULT_INVALID_AUTH_SEQ_NUM		= 7,  // APPLE80211_STATUS_INVALID_AUTH_SEQ_NUM
	APPLE80211_RESULT_CHALLENGE_FAILURE			= 8,  // APPLE80211_STATUS_CHALLENGE_FAILURE
	APPLE80211_RESULT_TIMEOUT					= 9,  // APPLE80211_STATUS_TIMEOUT
	APPLE80211_RESULT_AP_FULL					= 10, // APPLE80211_STATUS_AP_FULL
	APPLE80211_RESULT_UNSUPPORTED_RATE_SET		= 11, // APPLE80211_STATUS_UNSUPPORTED_RATE_SET
	APPLE80211_RESULT_SHORT_SLOT_UNSUPPORTED	= 12, // APPLE80211_STATUS_SHORT_SLOT_UNSUPPORTED
	APPLE80211_RESULT_DSSS_OFDM_UNSUPPORTED		= 13, // APPLE80211_STATUS_DSSS_OFDM_UNSUPPORTED
	APPLE80211_RESULT_INVALID_IE				= 14, // APPLE80211_STATUS_INVALID_IE
	APPLE80211_RESULT_INVALID_GROUP_CIPHER		= 15, // APPLE80211_STATUS_INVALID_GROUP_CIPHER
	APPLE80211_RESULT_INVALID_PAIRWISE_CIPHER	= 16, // APPLE80211_STATUS_INVALID_PAIRWISE_CIPHER
	APPLE80211_RESULT_INVALID_AKMP				= 17, // APPLE80211_STATUS_INVALID_AKMP
	APPLE80211_RESULT_UNSUPPORTED_RSN_VERSION	= 18, // APPLE80211_STATUS_UNSUPPORTED_RSN_VERSION
	APPLE80211_RESULT_INVALID_RSN_CAPABILITIES	= 19, // APPLE80211_STATUS_INVALID_RSN_CAPABILITIES
	APPLE80211_RESULT_CIPHER_SUITE_REJECTED		= 20, // APPLE80211_STATUS_CIPHER_SUIT_REJECTED
	APPLE80211_RESULT_INVALID_PMK				= 21, // APPLE80211_REASON_PREV_AUTH_EXPIRED received
	APPLE80211_RESULT_SUPPLICANT_TIMEOUT		= 22, // RSNSupplicant did not finish handshake
	APPLE80211_RESULT_UNKNOWN					= 0xffff // Unrecognized error condition
};

enum apple80211_unit
{
	APPLE80211_UNIT_DBM		= 0,		// dBm
	APPLE80211_UNIT_MW		= 1,		// milliwatts
	APPLE80211_UNIT_PERCENT	= 2,		// value expressed as a percentage
};

enum apple80211_power_state
{
	APPLE80211_POWER_OFF	= 0,	//	Chain disabled
	APPLE80211_POWER_ON		= 1,	//	Chain powered on for tx and rx
	APPLE80211_POWER_TX		= 2,	//	Chain powered on for tx only
	APPLE80211_POWER_RX		= 3,	//	Chain powered on for rx only
};

enum apple80211_locale
{
	APPLE80211_LOCALE_UNKNOWN	= 0,
	APPLE80211_LOCALE_FCC		= 1,
	APPLE80211_LOCALE_ETSI		= 2,
	APPLE80211_LOCALE_JAPAN		= 3,
	APPLE80211_LOCALE_KOREA		= 4,
	APPLE80211_LOCALE_APAC		= 5,
	APPLE80211_LOCALE_ROW		= 6,
};

enum apple80211_scan_type
{
	APPLE80211_SCAN_TYPE_NONE		= 0,
	APPLE80211_SCAN_TYPE_ACTIVE		= 1,
	APPLE80211_SCAN_TYPE_PASSIVE	= 2,
	APPLE80211_SCAN_TYPE_FAST		= 3,	// Ok to return cached scan results
	APPLE80211_SCAN_TYPE_BACKGROUND = 4,	// Initiate background scanning
};

enum apple80211_int_mit {
	APPLE80211_INT_MIT_OFF	= 0,
	APPLE80211_INT_MIT_AUTO = 1,
};

enum apple80211_channel_flag
{
	APPLE80211_C_FLAG_NONE		= 0x0,		// no flags
	APPLE80211_C_FLAG_10MHZ		= 0x1,		// 10 MHz wide
	APPLE80211_C_FLAG_20MHZ		= 0x2,		// 20 MHz wide
	APPLE80211_C_FLAG_40MHZ		= 0x4,		// 40 MHz wide
	APPLE80211_C_FLAG_2GHZ		= 0x8,		// 2.4 GHz
	APPLE80211_C_FLAG_5GHZ		= 0x10,		// 5 GHz
	APPLE80211_C_FLAG_IBSS		= 0x20,		// IBSS supported
	APPLE80211_C_FLAG_HOST_AP	= 0x40,		// HOST AP mode supported
	APPLE80211_C_FLAG_ACTIVE	= 0x80,		// active scanning supported
	APPLE80211_C_FLAG_DFS		= 0x100,	// DFS required
	APPLE80211_C_FLAG_EXT_ABV	= 0x200,	// If 40 Mhz, extension channel above.
											// If this flag is not set, then the
											// extension channel is below.
};

enum apple80211_rate_flag
{
	APPLE80211_RATE_FLAG_NONE	= 0x0,	// no flags
	APPLE80211_RATE_FLAG_BASIC	= 0x1,	// basic rate
	APPLE80211_RATE_FLAG_HT		= 0x2,	// HT rate computed from MCS index
};

enum apple80211_short_slot_mode
{
	APPLE80211_SHORT_SLOT_MODE_AUTO		= 1,	// Default behavior
	APPLE80211_SHORT_SLOT_MODE_LONG		= 2,	// long - short slot timing mode
	APPLE80211_SHORT_SLOT_MODE_SHORT	= 3,	// short - short slot timing mode
};

enum apple80211_powersave_mode
{
	// Standard modes
	APPLE80211_POWERSAVE_MODE_DISABLED		 = 0,
	APPLE80211_POWERSAVE_MODE_80211			 = 1,
	APPLE80211_POWERSAVE_MODE_VENDOR		 = 2,	//	Vendor specific mode, there should be
													//  more general apple modes in the future.
													//  Vendor modes also likely require more info.
	// Mimo modes
	APPLE80211_POWERSAVE_MODE_MIMO_STATIC	 = 3,
	APPLE80211_POWERSAVE_MODE_MIMO_DYNAMIC	 = 4,
	APPLE80211_POWERSAVE_MODE_MIMO_MIMO		 = 5,
	
	// WOW
	APPLE80211_POWERSAVE_MODE_WOW			 = 6,
	
	// Vendor specific powersave mode, throughput is maximized
	APPLE80211_POWERSAVE_MODE_MAX_THROUGHPUT = 7,
	
	// Vendor specific powersave mode, power savings are maximized, possibly
	// at the expense of throughput/latency.
	APPLE80211_POWERSAVE_MODE_MAX_POWERSAVE	 = 8,
};

enum apple80211_debug_flag
{
	APPLE80211_DEBUG_FLAG_NONE			= 0x0,	// No logging
	APPLE80211_DEBUG_FLAG_INFORMATIVE	= 0x1,	// Log "interesting" events
	APPLE80211_DEBUG_FLAG_ERROR			= 0x2,	// Log errors
	APPLE80211_DEBUG_FLAG_RSN			= 0x4,	// Full RSN supplicant logging
	APPLE80211_DEBUG_FLAG_SCAN			= 0x8,	// Scan events and information
};

enum apple80211_guard_interval
{
	APPLE80211_GI_SHORT	=	400,	// ns
	APPLE80211_GI_LONG	=	800,	// ns
};
												
#define APPLE80211_RSC_LEN				 8
#define APPLE80211_KEY_BUFF_LEN			32

#define	APPLE80211_KEY_FLAG_UNICAST		0x1
#define APPLE80211_KEY_FLAG_MULTICAST	0x2
#define APPLE80211_KEY_FLAG_TX			0x4
#define APPLE80211_KEY_FLAG_RX			0x8

struct apple80211_key
{
	u_int32_t			version;
	u_int32_t			key_len;
	u_int32_t			key_cipher_type;					// apple80211_cipher_type
	u_int16_t			key_flags;
	u_int16_t			key_index;
	u_int8_t			key[ APPLE80211_KEY_BUFF_LEN ];
	u_int32_t			key_rsc_len;
	u_int8_t			key_rsc[ APPLE80211_RSC_LEN ];	// receive sequence counter
	struct ether_addr	key_ea;							// key applies to this bssid
};

// Changing this affects any structure that contains a channel
struct apple80211_channel
{
	u_int32_t	version;
	u_int32_t	channel;	//	channel number
	u_int32_t	flags;		//	apple80211_channel_flag vector
};

struct apple80211_rate
{
	u_int32_t	version;
	u_int32_t	rate;	// rate mbps
	u_int32_t	flags;	// apple80211_rate_flag vector
};

// Probe response capability flags, IEEE 7.3.1.4
#define APPLE80211_CAPINFO_ESS				0x0001
#define APPLE80211_CAPINFO_IBSS				0x0002
#define APPLE80211_CAPINFO_CF_POLLABLE		0x0004
#define APPLE80211_CAPINFO_CF_POLLREQ		0x0008
#define APPLE80211_CAPINFO_PRIVACY			0x0010
#define APPLE80211_CAPINFO_SHORT_PREAMBLE	0x0020
#define APPLE80211_CAPINFO_PBCC				0x0040
#define APPLE80211_CAPINFO_AGILITY			0x0080
// 0x0100, 0x0200 reserved
#define APPLE80211_CAPINFO_SHORT_SLOT_TIME	0x0400
// 0x0800, 0x1000 reserved
#define APPLE80211_CAPINFO_DSSS_OFDM		0X2000
// 0x4000, 0x8000 reserved

// Reason codes IEEE 7.3.1.7
#define APPLE80211_REASON_UNSPECIFIED		1
#define APPLE80211_REASON_PREV_AUTH_EXPIRED	2
#define APPLE80211_REASON_AUTH_LEAVING		3
#define APPLE80211_REASON_INACTIVE			4
#define APPLE80211_REASON_AP_OVERLOAD		5
#define APPLE80211_REASON_NOT_AUTHED		6
#define APPLE80211_REASON_NOT_ASSOCED		7
#define APPLE80211_REASON_ASSOC_LEAVING		8
#define	APPLE80211_REASON_ASSOC_NOT_AUTHED	9
#define APPLE80211_REASON_POWER_CAP			10
#define APPLE80211_REASON_SUPPORTED_CHANS	11

#define APPLE80211_REASON_INVALID_IE		13
#define APPLE80211_REASON_MIC_FAILURE		14
#define APPLE80211_REASON_4_WAY_TIMEOUT		15
#define APPLE80211_REASON_GROUP_KEY_TIMEOUT	16
#define APPLE80211_REASON_DIFF_IE			17
#define APPLE80211_REASON_INVALID_GROUP_KEY 18
#define APPLE80211_REASON_INVALID_PAIR_KEY	19
#define APPLE80211_REASON_INVALID_AKMP		20
#define APPLE80211_REASON_UNSUPP_RSN_VER	21
#define APPLE80211_REASON_INVALID_RSN_CAPS	22
#define APPLE80211_REASON_8021X_AUTH_FAILED 23

// Status codes IEEE 7.3.1.9
#define APPLE80211_STATUS_SUCCESS					0
#define APPLE80211_STATUS_UNSPECIFIED_FAILURE		1
// 2-9 reserved
#define APPLE80211_STATUS_UNSUPPORTED_CAPABILITIES	10
#define APPLE80211_STATUS_REASSOCIATION_DENIED		11
#define APPLE80211_STATUS_ASSOCIATION_DENIED		12
#define APPLE80211_STATUS_AUTH_ALG_UNSUPPORTED		13
#define	APPLE80211_STATUS_INVALID_AUTH_SEQ_NUM		14
#define APPLE80211_STATUS_CHALLENGE_FAILURE			15
#define APPLE80211_STATUS_TIMEOUT					16
#define APPLE80211_STATUS_AP_FULL					17
#define APPLE80211_STATUS_UNSUPPORTED_RATE_SET		18
// 22-24 reserved
#define APPLE80211_STATUS_SHORT_SLOT_UNSUPPORTED	25
#define APPLE80211_STATUS_DSSS_OFDM_UNSUPPORTED		26
// 27-39 reserved
#define APPLE80211_STATUS_INVALID_IE				40
#define APPLE80211_STATUS_INVALID_GROUP_CIPHER		41
#define APPLE80211_STATUS_INVALID_PAIRWISE_CIPHER	42
#define APPLE80211_STATUS_INVALID_AKMP				43
#define APPLE80211_STATUS_UNSUPPORTED_RSN_VERSION	44
#define APPLE80211_STATUS_INVALID_RSN_CAPABILITIES	45
#define APPLE80211_STATUS_CIPHER_SUITE_REJECTED		46
// 47 - 65535 reserved
#define APPLE80211_STATUS_UNAVAILABLE				0xffff

// If mcs index is set to APPLE80211_MCS_INDEX_AUTO, the interface
// should go to auto rate selection, and abandon any previously 
// configured static MCS indices
#define APPLE80211_MCS_INDEX_AUTO	0xffffffff

/*
DSCP TOS/Traffic class values for WME access categories taken from 
WiFi WMM Test Plan v 1.3.1 Appendix C.

TOS/Traffic class field looks like:

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
|          DSCP         |  ECN  |
+---+---+---+---+---+---+---+---+

These bits are numbered according to rfc 2474, but might be misleading.
It looks like bit 0 is actually the high order bit.
*/

#define APPLE80211_DSCP_WME_BE	0x00
#define	APPLE80211_DSCP_WME_BK	0x08
#define APPLE80211_DSCP_WME_VI	0x28
#define APPLE80211_DSCP_WME_VO	0x38

// Access category values set in the mbuf
#define APPLE80211_WME_AC_BE	0
#define APPLE80211_WME_AC_BK	1
#define APPLE80211_WME_AC_VI	2
#define APPLE80211_WME_AC_VO	3

// Working within the limitations of the kpi mbuf routines, the receive interface pointer 
// is the best place to put this for now since it is not used on the output path. The mbuf 
// kpi doesn't allow us to access unused flags, or I would put the WME AC in there like 
// everyone else.

#define APPLE80211_MBUF_SET_WME_AC( m, ac ) mbuf_pkthdr_setrcvif( m, (ifnet_t)ac )
#define APPLE80211_MBUF_WME_AC( m ) (int)mbuf_pkthdr_rcvif( m )

struct apple80211_scan_result
{
	u_int32_t					version;
	struct apple80211_channel	asr_channel;
	int16_t						asr_noise;
	int16_t						asr_rssi;
	u_int16_t					asr_beacon_int;
	u_int16_t					asr_cap;		// capabilities
	u_int8_t					asr_bssid[ APPLE80211_ADDR_LEN ];
	u_int8_t					asr_nrates;
	u_int32_t					asr_rates[ APPLE80211_MAX_RATES ];
	u_int8_t					asr_ssid_len;
	u_int8_t					asr_ssid[ APPLE80211_MAX_SSID_LEN ];
	u_int32_t					asr_age;	// (ms) non-zero for cached scan result
	u_int16_t					asr_ie_len;
	void					   *asr_ie_data;
};

struct apple80211_network_data
{
	u_int32_t					version;
	u_int16_t					nd_mode;			// apple80211_apmode
	u_int16_t					nd_auth_lower;		// apple80211_authtype_lower
	u_int16_t					nd_auth_upper;		// apple80211_authtype_upper
	struct apple80211_channel	nd_channel;
	u_int32_t					nd_ssid_len;
	u_int8_t					nd_ssid[ APPLE80211_MAX_SSID_LEN ];
	struct apple80211_key		nd_key;
	u_int32_t					nd_ie_len;
	void					   *nd_ie_data;
};

#define APPLE80211_NETWORK_DATA_MAX_IE_LEN 1024

// As hostap support improves, this will grow
struct apple80211_station
{
	u_int32_t			version;
	struct ether_addr	sta_mac;
	int32_t				sta_rssi;
};

// WOW structures and defines

struct apple80211_wow_pattern
{
	size_t len;
	u_int8_t * pattern;
};

enum apple80211_wake_condition
{
	APPLE80211_WAKE_COND_MAGIC_PATTERN  = 0,
	APPLE80211_WAKE_COND_NET_PATTERN    = 1,
	APPLE80211_WAKE_COND_DISASSOCIATED  = 2,
	APPLE80211_WAKE_COND_DEAUTHED	    = 3,
	APPLE80211_WAKE_COND_RETROGRADE_TSF = 4,
	APPLE80211_WAKE_COND_BEACON_LOSS	= 5,
};

#define APPLE80211_MAX_WAKE_COND 5	

enum apple80211_card_capability
{
	APPLE80211_CAP_WEP				= 0,	// CAPABILITY: WEP available
	APPLE80211_CAP_TKIP				= 1,	// CAPABILITY: TKIP available
	APPLE80211_CAP_AES				= 2,	// CAPABILITY: AES OCB avail
	APPLE80211_CAP_AES_CCM			= 3,	// CAPABILITY: AES CCM avail
	APPLE80211_CAP_CKIP				= 4,	// CAPABILITY: CKIP available
	APPLE80211_CAP_IBSS				= 5,	// CAPABILITY: IBSS available
	APPLE80211_CAP_PMGT				= 6,	// CAPABILITY: Power mgmt
	APPLE80211_CAP_HOSTAP			= 7,	// CAPABILITY: HOSTAP avail
	APPLE80211_CAP_TXPMGT			= 8,	// CAPABILITY: tx power mgmt
	APPLE80211_CAP_SHSLOT			= 9,	// CAPABILITY: short slottime
	APPLE80211_CAP_SHPREAMBLE		= 10,	// CAPABILITY: short preamble
	APPLE80211_CAP_MONITOR			= 11,	// CAPABILITY: monitor mode
	APPLE80211_CAP_TKIPMIC			= 12,	// CAPABILITY: TKIP MIC avail
	APPLE80211_CAP_WPA1				= 13,	// CAPABILITY: WPA1 avail
	APPLE80211_CAP_WPA2				= 14,	// CAPABILITY: WPA2 avail
	APPLE80211_CAP_WPA				= 15,	// CAPABILITY: WPA1+WPA2 avail
	APPLE80211_CAP_BURST			= 16,	// CAPABILITY: frame bursting
	APPLE80211_CAP_WME				= 17,	// CAPABILITY: WME avail
	APPLE80211_CAP_SHORT_GI_40MHZ	= 18,	// CAPABILITY: Short guard interval in 40 MHz
	APPLE80211_CAP_SHORT_GI_20MHZ	= 19,	// CAPABILITY: Short guard interval in 20 MHz
	APPLE80211_CAP_WOW				= 20,	// CAPABILITY: Wake on wireless
	APPLE80211_CAP_TSN				= 21,	// CAPABILITY: WPA with WEP group key
};
#define APPLE80211_CAP_MAX	21

enum apple80211_assoc_flags {
	APPLE80211_ASSOC_F_CLOSED	= 1,	// flag: scan was directed, needed to remember closed networks
};

// Kernel messages

struct apple80211_status_msg_hdr
{
	u_int32_t	msg_type;		//	type of message
	u_int32_t	msg_len;		//  length of data (not including msg_type and msg_len)
	
	// data follows
};

#define APPLE80211_M_MAX_LEN				2048

#define APPLE80211_M_POWER_CHANGED			1
#define APPLE80211_M_SSID_CHANGED			2
#define APPLE80211_M_BSSID_CHANGED			3
#define APPLE80211_M_LINK_CHANGED			4
#define APPLE80211_M_MIC_ERROR_UCAST		5
#define APPLE80211_M_MIC_ERROR_MCAST		6
#define APPLE80211_M_INT_MIT_CHANGED		7
#define APPLE80211_M_MODE_CHANGED			8
#define APPLE80211_M_ASSOC_DONE				9
#define APPLE80211_M_SCAN_DONE				10
#define APPLE80211_M_COUNTRY_CODE_CHANGED	11
#define APPLE80211_M_STA_ARRIVE				12
#define APPLE80211_M_STA_LEAVE				13

#define APPLE80211_M_MAX					13
#define APPLE80211_M_BUFF_SIZE				APPLE80211_MAP_SIZE( APPLE80211_M_MAX )

// Registry Information
#define APPLE80211_REGKEY_HARDWARE_VERSION	"IO80211HardwareVersion"
//#define APPLE80211_REG_FIRMWARE_VERSION	"IO80211FirmwareVersion"
#define APPLE80211_REGKEY_DRIVER_VERSION	"IO80211DriverVersion"
#define APPLE80211_REGKEY_LOCALE			"IO80211Locale"
#define APPLE80211_REGKEY_SSID				"IO80211SSID"
#define APPLE80211_REGKEY_CHANNEL			"IO80211Channel"
#define APPLE80211_REGKEY_EXT_CHANNEL		"IO80211ExtensionChannel"
#define APPLE80211_REGKEY_BAND				"IO80211Band"
	#define APPLE80211_BAND_2GHZ			"2 GHz"
	#define APPLE80211_BAND_5GHZ			"5 GHz"
#define APPLE80211_REGKEY_COUNTRY_CODE		"IO80211CountryCode"

// Userland messages
#define APPLE80211_M_RSN_AUTH_SUCCESS			254
#define APPLE80211_M_RSN_AUTH_SUCCESS_TEMPLATE	"com.apple.rsn.%s.auth.success"	// string is interface name

#define APPLE80211_M_RSN_AUTH_TIMEOUT			255
#define APPLE80211_M_RSN_AUTH_TIMEOUT_TEMPLATE	"com.apple.rsn.%s.auth.timeout"	// string is interface name

#define APPLE80211_M_RSN_MSG_MAX				2

#endif // _APPLE80211_VAR_H_